home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Other Langs / Tickle-4.0 (tcl) / tcl / src / tclUnix.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-02  |  6.9 KB  |  311 lines  |  [TEXT/MPS ]

  1. /*
  2.  * tclUnix.h --
  3.  *
  4.  *    This file reads in UNIX-related header files and sets up
  5.  *    UNIX-related macros for Tcl's UNIX core.  It should be the
  6.  *    only file that contains #ifdefs to handle different flavors
  7.  *    of UNIX.  This file sets up the union of all UNIX-related
  8.  *    things needed by any of the Tcl core files.  This file
  9.  *    depends on configuration #defines in tclConfig.h
  10.  *
  11.  *    Much of the material in this file was originally contributed
  12.  *    by Karl Lehenbauer, Mark Diekhans and Peter da Silva.
  13.  *
  14.  * Copyright (c) 1991-1993 The Regents of the University of California.
  15.  * All rights reserved.
  16.  *
  17.  * Permission is hereby granted, without written agreement and without
  18.  * license or royalty fees, to use, copy, modify, and distribute this
  19.  * software and its documentation for any purpose, provided that the
  20.  * above copyright notice and the following two paragraphs appear in
  21.  * all copies of this software.
  22.  * 
  23.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  24.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  25.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  26.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  *
  28.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  29.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  30.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  31.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  32.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  33.  *
  34.  * $Header: /user6/ouster/tcl/RCS/tclUnix.h,v 1.45 93/08/23 09:10:55 ouster Exp $ SPRITE (Berkeley)
  35.  */
  36.  
  37. #ifndef _TCLUNIX
  38. #define _TCLUNIX
  39.  
  40. #ifdef macintosh
  41.  
  42. #include <errno.h>
  43. #include <fcntl.h>
  44. #include <limits.h>
  45. #include <signal.h>
  46. #include "stat.h"
  47. #include <time.h>
  48.  
  49. #else
  50.  
  51. #include <errno.h>
  52. #include <fcntl.h>
  53. #include <pwd.h>
  54. #include <signal.h>
  55. #include <sys/param.h>
  56. #include <sys/types.h>
  57. #ifdef USE_DIRENT2_H
  58. #   include "compat/dirent2.h"
  59. #else
  60. #   ifdef NO_DIRENT_H
  61. #    include "compat/dirent.h"
  62. #   else
  63. #    include <dirent.h>
  64. #   endif
  65. #endif
  66. #include <sys/file.h>
  67. #include <sys/stat.h>
  68. #ifndef NO_SYS_TIME_H
  69. #   include <sys/time.h>
  70. #else
  71. #   include <time.h>
  72. #endif
  73. #ifndef NO_SYS_WAIT_H
  74. #   include <sys/wait.h>
  75. #endif
  76. #ifdef HAVE_UNISTD_H
  77. #   include <unistd.h>
  78. #else
  79. #   include "compat/unistd.h"
  80. #endif
  81.  
  82. #endif /* macintosh */
  83.  
  84. /*
  85.  * Not all systems declare the errno variable in errno.h. so this
  86.  * file does it explicitly.  The list of system error messages also
  87.  * isn't generally declared in a header file anywhere.
  88.  */
  89.  
  90. extern int errno;
  91. extern int sys_nerr;
  92. extern char *sys_errlist[];
  93.  
  94. /*
  95.  * The type of the status returned by wait varies from UNIX system
  96.  * to UNIX system.  The macro below defines it:
  97.  */
  98.  
  99. #ifdef AIX
  100. #   define WAIT_STATUS_TYPE pid_t
  101. #else
  102. #ifndef NO_UNION_WAIT
  103. #   define WAIT_STATUS_TYPE union wait
  104. #else
  105. #   define WAIT_STATUS_TYPE int
  106. #endif
  107. #endif
  108.  
  109. /*
  110.  * Supply definitions for macros to query wait status, if not already
  111.  * defined in header files above.
  112.  */
  113.  
  114. #ifndef WIFEXITED
  115. #   define WIFEXITED(stat)  (((*((int *) &(stat))) & 0xff) == 0)
  116. #endif
  117.  
  118. #ifndef WEXITSTATUS
  119. #   define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff)
  120. #endif
  121.  
  122. #ifndef WIFSIGNALED
  123. #   define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff)))
  124. #endif
  125.  
  126. #ifndef WTERMSIG
  127. #   define WTERMSIG(stat)    ((*((int *) &(stat))) & 0x7f)
  128. #endif
  129.  
  130. #ifndef WIFSTOPPED
  131. #   define WIFSTOPPED(stat)  (((*((int *) &(stat))) & 0xff) == 0177)
  132. #endif
  133.  
  134. #ifndef WSTOPSIG
  135. #   define WSTOPSIG(stat)    (((*((int *) &(stat))) >> 8) & 0xff)
  136. #endif
  137.  
  138. /*
  139.  * Supply macros for seek offsets, if they're not already provided by
  140.  * an include file.
  141.  */
  142.  
  143. #ifndef SEEK_SET
  144. #   define SEEK_SET 0
  145. #endif
  146.  
  147. #ifndef SEEK_CUR
  148. #   define SEEK_CUR 1
  149. #endif
  150.  
  151. #ifndef SEEK_END
  152. #   define SEEK_END 2
  153. #endif
  154.  
  155. /*
  156.  * The stuff below is needed by the "time" command.  If this
  157.  * system has no gettimeofday call, then must use times and the
  158.  * CLK_TCK #define (from sys/param.h) to compute elapsed time.
  159.  * Unfortunately, some systems only have HZ and no CLK_TCK, and
  160.  * some might not even have HZ.
  161.  */
  162.  
  163. #ifdef NO_GETTOD
  164. #   include <sys/times.h>
  165. #   include <sys/param.h>
  166. #   ifndef CLK_TCK
  167. #       ifdef HZ
  168. #           define CLK_TCK HZ
  169. #       else
  170. #           define CLK_TCK 60
  171. #       endif
  172. #   endif
  173. #endif
  174.  
  175. /*
  176.  * Define access mode constants if they aren't already defined.
  177.  */
  178.  
  179. #ifndef F_OK
  180. #    define F_OK 00
  181. #endif
  182. #ifndef X_OK
  183. #    define X_OK 01
  184. #endif
  185. #ifndef W_OK
  186. #    define W_OK 02
  187. #endif
  188. #ifndef R_OK
  189. #    define R_OK 04
  190. #endif
  191.  
  192. /*
  193.  * On systems without symbolic links (i.e. S_IFLNK isn't defined)
  194.  * define "lstat" to use "stat" instead.
  195.  */
  196.  
  197. #ifndef macintosh
  198. #ifndef S_IFLNK
  199. #   define lstat stat
  200. #endif
  201. #endif
  202.  
  203. #ifdef macintosh
  204. #ifndef O_NDELAY
  205. #    define O_NDELAY    00004
  206. #endif
  207. #endif
  208.  
  209. /*
  210.  * Define macros to query file type bits, if they're not already
  211.  * defined.
  212.  */
  213.  
  214. #ifndef S_ISREG
  215. #   ifdef S_IFREG
  216. #       define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
  217. #   else
  218. #       define S_ISREG(m) 0
  219. #   endif
  220. # endif
  221. #ifndef S_ISDIR
  222. #   ifdef S_IFDIR
  223. #       define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
  224. #   else
  225. #       define S_ISDIR(m) 0
  226. #   endif
  227. # endif
  228. #ifndef S_ISCHR
  229. #   ifdef S_IFCHR
  230. #       define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
  231. #   else
  232. #       define S_ISCHR(m) 0
  233. #   endif
  234. # endif
  235. #ifndef S_ISBLK
  236. #   ifdef S_IFBLK
  237. #       define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
  238. #   else
  239. #       define S_ISBLK(m) 0
  240. #   endif
  241. # endif
  242. #ifndef S_ISFIFO
  243. #   ifdef S_IFIFO
  244. #       define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
  245. #   else
  246. #       define S_ISFIFO(m) 0
  247. #   endif
  248. # endif
  249. #ifndef S_ISLNK
  250. #   ifdef S_IFLNK
  251. #       define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
  252. #   else
  253. #       define S_ISLNK(m) 0
  254. #   endif
  255. # endif
  256. #ifndef S_ISSOCK
  257. #   ifdef S_IFSOCK
  258. #       define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
  259. #   else
  260. #       define S_ISSOCK(m) 0
  261. #   endif
  262. # endif
  263.  
  264. /*
  265.  * Make sure that MAXPATHLEN is defined.
  266.  */
  267.  
  268. #ifndef MAXPATHLEN
  269. #   ifdef PATH_MAX
  270. #       define MAXPATHLEN PATH_MAX
  271. #   else
  272. #       define MAXPATHLEN 2048
  273. #   endif
  274. #endif
  275.  
  276. /*
  277.  * Make sure that L_tmpnam is defined.
  278.  */
  279.  
  280. #ifndef L_tmpnam
  281. #   define L_tmpnam 100
  282. #endif
  283.  
  284. /*
  285.  * Substitute Tcl's own versions for several system calls.  The
  286.  * Tcl versions retry automatically if interrupted by signals.
  287.  * (see tclUnixUtil.c).
  288.  */
  289.  
  290. #ifndef Macintosh
  291. #    define open(a,b,c)        TclOpen(a,b,c)
  292. #    define read(a,b,c)        TclRead(a,b,c)
  293. #    define waitpid(a,b,c)    TclWaitpid(a,b,c)
  294. #    define write(a,b,c)        TclWrite(a,b,c)
  295. #endif
  296. EXTERN int    TclOpen _ANSI_ARGS_((char *path, int oflag, int mode));
  297. EXTERN int    TclRead _ANSI_ARGS_((int fd, VOID *buf, size_t numBytes));
  298. EXTERN int    TclWaitpid _ANSI_ARGS_((pid_t pid, int *statPtr, int options));
  299. EXTERN int    TclWrite _ANSI_ARGS_((int fd, VOID *buf, size_t numBytes));
  300.  
  301. /*
  302.  * Variables provided by the C library:
  303.  */
  304.  
  305. #if defined(_sgi) || defined(__sgi)
  306. #define environ _environ
  307. #endif
  308. extern char **environ;
  309.  
  310. #endif /* _TCLUNIX */
  311.